package random;

import java.util.*;

/**
 * 员工的重要性
 *
 * 给定一个保存员工信息的数据结构，它包含了员工 唯一的 id ，重要度 和 直系下属的 id 。
 * 比如，员工 1 是员工 2 的领导，员工 2 是员工 3 的领导。他们相应的重要度为 15 , 10 , 5 。
 * 那么员工 1 的数据结构是 [1, 15, [2]] ，员工 2的 数据结构是 [2, 10, [3]] ，
 * 员工 3 的数据结构是 [3, 5, []] 。注意虽然员工 3 也是员工 1 的一个下属，但是由于 并不是直系 下属，因此没有体现在员工 1 的数据结构中。
 *
 * 现在输入一个公司的所有员工信息，以及单个员工 id ，返回这个员工和他所有下属的重要度之和。
 */

public class L690 {

    public static void main(String[] args) {

        List<Integer> emp1 = new ArrayList<>();
        emp1.add(2);
        emp1.add(3);
        List<Integer> emp2 = new ArrayList<>();
        List<Integer> emp3 = new ArrayList<>();
        Employee employee1 = new Employee(1, 5, emp1);
        Employee employee2 = new Employee(2, 3, emp2);
        Employee employee3 = new Employee(3, 3, emp3);
        List<Employee> list = new ArrayList<>();
        list.add(employee1);
        list.add(employee2);
        list.add(employee3);
        int importance = getImportance(list, 1);
        System.out.println(importance);
    }



    // 深度优先排序
    public static Map<Integer, Employee> map = new HashMap<>();

    public static int getImportance(List<Employee> employees, int id) {

        for (Employee emp : employees) {
            map.put(emp.id, emp);
        }

        return dfs(id);
    }

    private static int dfs(int id) {

        Employee employee = map.get(id);
        int total = employee.importance;
        List<Integer> subordinates = employee.subordinates;
        for (Integer i : subordinates) {
            total += dfs(i);
        }

        return total;
    }


    // 广度优先搜索
    public static int getImportance1(List<Employee> employees, int id) {
        Map<Integer, Employee> map = new HashMap<Integer, Employee>();
        for (Employee employee : employees) {
            map.put(employee.id, employee);
        }
        int total = 0;
        Queue<Integer> queue = new LinkedList<Integer>();
        queue.offer(id);
        while (!queue.isEmpty()) {
            int curId = queue.poll();
            Employee employee = map.get(curId);
            total += employee.importance;
            List<Integer> subordinates = employee.subordinates;
            for (int subId : subordinates) {
                queue.offer(subId);
            }
        }
        return total;
    }

/*    作者：LeetCode-Solution
    链接：https://leetcode-cn.com/problems/employee-importance/solution/yuan-gong-de-zhong-yao-xing-by-leetcode-h6xre/
    来源：力扣（LeetCode）
    著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。*/








    static class Employee {

        public int id;
        public int importance;
        public List<Integer> subordinates;

        public Employee(int id, int importance, List<Integer> subordinates) {
            this.id = id;
            this.importance = importance;
            this.subordinates = subordinates;
        }
    }
}
